<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>08-如何判断 JS 数据类型</title>
</head>

<body>
    <script>
        /*
            基本数据类型
                string 字符串
                number  数值
                boolean 布尔值  true/false
                undefined   定义未赋值  undefined
                null    空   null
                bigint  大的整数类型
                    js中对可操作的最大值和最小值进行运算，可能会出现问题，这个时候就考虑到要用bigint类型去操作
                symbol  唯一值
                    一般使用Symbol给对象添加要给唯一的属性
            引用数据类型
                array
                function
                object
        */
        // typeof
        // 判断基本数据类型，除了null返回object，其余类型都能正常返回
        // 判断引用数据类型，函数能返回正常数据类型，数组和对象都返回object
        // 一般使用typeof来判断基本数据类型
        // console.log(typeof 'abc')
        // console.log(typeof 123)
        // console.log(typeof false)
        // console.log(typeof undefined)
        // console.log(typeof null)   //  object
        // console.log(typeof 10n)
        // console.log(typeof Symbol())
        // console.log('---------------------------')
        // console.log(typeof [])   // object
        // console.log(typeof function () { })
        // console.log(typeof {})  // object
        // instanceof
        // A instanceof B
        // 解释一：判断 A 是不是 B的实例
        // 解释二： 判断 A的隐式原型链 是否出现在B的显示原型上
        // 返回值：true/fale
        // 注意：instanceof不能判断基本数据类型，返回的都是false
        // 一般用instanceof来判断引用数据类型
        // console.log('abc' instanceof String)
        // console.log(123 instanceof Number)
        // console.log(false instanceof Boolean)
        // // console.log(undefined instanceof Undefined)
        // // console.log(null instanceof Null)
        // console.log(10n instanceof BigInt)
        // console.log(Symbol() instanceof Symbol)
        // console.log('---------------------------')
        // console.log([] instanceof Array)
        // console.log(function () { } instanceof Function)
        // console.log({} instanceof Object)

        // constructor
        // var num = 123
        // console.log( 'abc'.constructor === String)
        // console.log( num.constructor === Number)
        // console.log( false.constructor === Boolean)
        // // console.log( undefined.constructor === Undefined)
        // // console.log( null.constructor === Null)  
        // console.log( 10n.constructor === BigInt)
        // console.log( Symbol().constructor === Symbol)
        // console.log('---------------------------')
        // console.log( [].constructor === Array)   
        // console.log( function () { }.constructor === Function)
        // console.log( {}.constructor === Object) 

        // toString
        // 可以判断所有数据类型。
        // 用起来比较麻烦，一般会封装成方法去使用
        // function getType(val) {
        //     return Object.prototype.toString.call(val).slice(8, -1)
        // }
        // console.log(getType('abc'))
        // console.log(getType(123))
        // console.log(getType(false))
        // console.log(getType(undefined))
        // console.log(getType(null))
        // console.log(getType(10n))
        // console.log(getType(Symbol()))
        // console.log('---------------------------')
        // console.log(getType([]))
        // console.log(getType(function () { }))
        // console.log(getType({}))

        // Array.isArray
        // 有局限性，只能判断数组
        // console.log(Array.isArray('1232'))
        // console.log(Array.isArray({}))
        // console.log(Array.isArray([]))
        // ===
        // 判断值和类型是否相等
        console.log(1 == '1')
        console.log(1 === '1')
    </script>
</body>

</html>